package com.study.shiro.realm;

import com.study.Constants.Constant;
import com.study.entity.system.Permission;
import com.study.entity.system.User;
import com.study.service.PermissionService;
import com.study.service.UserService;
import com.study.vo.system.ProfileResult;
import org.apache.shiro.authc.*;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

/**
 * @Author wfw
 * @Date 2020/07/12 17:47
 */
public class UserRealm extends MyRealm {
    @Autowired
    private UserService userService;

    @Autowired
    private PermissionService permissionService;

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        // 获取用户的手机号和密码
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) authenticationToken;
        String tel = usernamePasswordToken.getUsername();
        String password = new String(usernamePasswordToken.getPassword());

        User user = userService.findByMobile(tel);

        // 根据用户是否存在,用户密码是否和输入密码一致
        if (user != null && user.getPassword().equals(password)) {
            // 构造安全数据并返回(安全数据：用户基本信息,权限信息,ProfileResult)
            ProfileResult profileResult;
            // 如果是员工,就把员工的信息保存
            if (Constant.UserLevelConstant.USER.equals(user.getLevel())) {
                profileResult = new ProfileResult(user);
            } else {
                Permission permission = new Permission();
                if (Constant.UserLevelConstant.COADMIN.equals(user.getLevel())) {
                    // 企业管理员,就查询企业管理员可见的
                    permission.setEnVisible("1");
                } else if (Constant.UserLevelConstant.SAASADMIN.equals(user.getLevel())) {
                    /**
                     * SaaS管理员，只显示企业不显示的
                     * 即只显示企业管理和模块管理
                     */
                    permission.setEnVisible("0");
                }

                List<Permission> permissionList = permissionService.findAll(permission);
                profileResult = new ProfileResult(user, permissionList);
            }

            // 构造方法：安全数据,密码,realm域名
            SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(profileResult, user.getPassword(), this.getName());
            return info;
        }

        // 返回null,会抛出异常,表示用户名和密码不匹配
        return null;
    }
}
